package com.xwj.service;

import org.apache.rocketmq.client.producer.SendResult;

public interface ProducerService {
    /**
     * 同步发送消息：Producer发出消息后，需要收到MQ返回ACK之后才会发送下一条消息，该方
     * 式的消息可靠性最高，效率低
     * @param msg
     * @return
     */
    SendResult syncSendMsg(String msg);

    /**
     * 异步发送消息：producer向 broker 发送消息时指定消息发送成功及发送异常的回调方法，调用 API 后立即返回，
     * producer发送消息线程不阻塞 ，消息发送成功或失败的回调任务在一个新的线程中执行 。
     * @param msg
     */
    void asyncSendMsg(String msg);

    /**
     * 异步顺序发送消息：分区有序，根据键的hash策略，让消息发送到同一个队列中，保证局部有序
     * 例如：相同订单号的消息被有序发送到同一个队列中，消费时，同一个订单号获取到的肯定是同一个队列。
     * @param msg
     * @param hashKey
     */
    void asyncSendOrderly(String msg, String hashKey);

    /**
     * 异步发送消息：producer向 broker 发送消息时指定消息发送成功及发送异常的回调方法，调用 API 后立即返回，
     * producer发送消息线程不阻塞 ，消息发送成功或失败的回调任务在一个新的线程中执行 。
     * @param msg
     */
    void asyncSendMsgWithTag(String msg, String tag);

    /**
     * 单向发送消息：producer向 broker 发送消息，执行 API 时直接返回，不等待broker 服务器的结果 。
     * @param msg
     */
    void oneWaySendMsg(String msg);
}
